package com.tp2.dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.tp2.bo.Oferta;
import com.tp2.bo.impl.OfertaMarcaCategoria;
import com.tp2.bo.impl.OfertaProducto;
import com.tp2.bo.impl.OfertaTotal;
import com.tp2.dominio.MedioDePago;
import com.tp2.dominio.Producto;
import com.tp2.dominio.TarjetaDescuento;

public class ParserOfertas extends Parser {

	private Collection<Oferta> ofertas;

	private OfertaTotal ofertaTotalTmp;
	private OfertaProducto ofertaProductoTmp;
	private OfertaMarcaCategoria ofertaMarcaCategoriaTmp;
	private SimpleDateFormat formatoFecha = new SimpleDateFormat("dd-MM-yyyy");
	private Oferta ofertaActual;
	private String tipoDeOfertaActual;
	
	public ParserOfertas(){
		
		super ("ofertasXML.xml");
		ofertas = new ArrayList<Oferta>();
		parseDocument();
	}
	
	public ParserOfertas(String nombreXML){
		
		super (nombreXML);
		ofertas = new ArrayList<Oferta>();
		parseDocument();
	}
	
	public Collection<Oferta> getOfertas() {
		return ofertas;
	}

	@Override
	public void startElement(String s, String s1, String elementName, Attributes attributes)
			throws SAXException {

		if (elementName.equalsIgnoreCase("OfertaTotal")) {
			ofertaTotalTmp = new OfertaTotal();
			
			ofertaTotalTmp.setMedioDePago(new MedioDePago(attributes.getValue("medioDePago")));
			int porcentaje = Integer.parseInt((attributes.getValue("porcentaje")));
			ofertaTotalTmp.setPorcentaje(porcentaje);
			parsearVigencias(ofertaTotalTmp,attributes);
			
			ofertaTotalTmp.setDescripcion(attributes.getValue("descripcion"));
			
			if(attributes.getValue("futura") != null && !attributes.getValue("futura").isEmpty())
				ofertaTotalTmp.setGeneraCupon(true);
			
			String nombre = attributes.getValue("tarjetaDeDescuento");
			if (nombre != null)
				ofertaTotalTmp.setTarjetaDescuento(new TarjetaDescuento(nombre));
			
			ofertaActual = ofertaTotalTmp;

		}

		if (elementName.equalsIgnoreCase("OfertaProducto")) {
			
			ofertaProductoTmp = new OfertaProducto();
			parsearVigencias(ofertaProductoTmp,attributes);
			ofertaProductoTmp.setDescripcion(attributes.getValue("descripcion"));
			tipoDeOfertaActual = "Producto";
			ofertaActual = ofertaProductoTmp;
			
			if(attributes.getValue("futura") != null && !attributes.getValue("futura").isEmpty())
				ofertaProductoTmp.setGeneraCupon(true);
			
			String nombre = attributes.getValue("tarjetaDeDescuento");
			if (nombre != null)
				ofertaProductoTmp.setTarjetaDescuento(new TarjetaDescuento(nombre));
		}
		
		if (elementName.equalsIgnoreCase("OfertaMarcaCategoria")) {
			
			ofertaMarcaCategoriaTmp = new OfertaMarcaCategoria();
			parsearVigencias(ofertaMarcaCategoriaTmp,attributes);
			ofertaMarcaCategoriaTmp.setDescripcion(attributes.getValue("descripcion"));
			
			if(attributes.getValue("futura") != null && !attributes.getValue("futura").isEmpty())
				ofertaMarcaCategoriaTmp.setGeneraCupon(true);
			
			String nombre = attributes.getValue("tarjetaDeDescuento");
			if (nombre != null)
				ofertaMarcaCategoriaTmp.setTarjetaDescuento(new TarjetaDescuento(nombre));
			tipoDeOfertaActual = "MarcaCategoria";
			ofertaActual = ofertaMarcaCategoriaTmp;
			
		}
		
		if (elementName.equalsIgnoreCase("ProductoAdherido")) {

			double porcentaje = Double.parseDouble((attributes.getValue("porcentaje")));

			Producto productoAdherido = parsearElementoProducto(attributes);
			
			if( tipoDeOfertaActual == "Producto"){
				ofertaProductoTmp.getProductosAdheridos().put(productoAdherido, porcentaje);
			}else
				ofertaMarcaCategoriaTmp.getProductosAdheridos().put(productoAdherido, porcentaje);

		}

		if (elementName.equalsIgnoreCase("ProductoExcluido")) {

			Producto productoExcluido = parsearElementoProducto(attributes);

			if( tipoDeOfertaActual == "Producto"){
				ofertaProductoTmp.getProductosExcluidos().add(productoExcluido);
			}else
				ofertaMarcaCategoriaTmp.getProductosExcluidos().add(productoExcluido);

		}
		
	}

	@Override
	public void endElement(String s, String s1, String element) throws SAXException {

		if (element.equalsIgnoreCase("OfertaTotal")) {
			ofertas.add(ofertaTotalTmp);
		}

		if (element.equalsIgnoreCase("OfertaProducto")) {
			ofertas.add(ofertaProductoTmp);
		}
		
		if (element.equalsIgnoreCase("OfertaMarcaCategoria")) {
			ofertas.add(ofertaMarcaCategoriaTmp);
		}
		
		if (element.equalsIgnoreCase("DiaOferta")) {
			
			DiasDeLaSemana dia = DiasDeLaSemana.valueOf(tmpValue.toUpperCase());

			ofertaActual.getDiasQueAplica().add(dia.ordinal()+1);
		}
		
	}
	
	private Producto parsearElementoProducto(Attributes attributes) {

		String nombre = attributes.getValue("nombre");
		if(nombre != null && nombre.isEmpty())
			nombre = null;
		String categoria = attributes.getValue("categoria");
		if(categoria != null && categoria.isEmpty())
			categoria = null;
		String marca = attributes.getValue("marca");
		if(marca != null && marca.isEmpty())
			marca = null;
		double precio = 0;

		return new Producto(nombre, marca, precio, categoria);

	}
	
	private void parsearVigencias(Oferta oferta, Attributes attributes){
		
		try {
			Date vigenciaDesde = formatoFecha.parse(attributes.getValue("vigenciaDesde"));
			Date vigenciaHasta = formatoFecha.parse(attributes.getValue("vigenciaHasta"));
			
			oferta.setVigenciaDesde(vigenciaDesde);
			oferta.setVigenciaHasta(vigenciaHasta);
			
		} catch (ParseException e) {

			oferta.setVigenciaDesde(new Date());
			oferta.setVigenciaHasta(new Date());
		}
	}
	
}
